﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using SGAEntidades;
using SGABDUtil;
using SGAInterfaces;

namespace SGAAccesoDatos
{
    public class SolicitudTaxi : ISolicitudTaxi
    {
        public IList<SolicitudTaxiInfo> Listar(SolicitudTaxiInfo oSolicitudTaxi)
        {
            var sqlParm = new SqlParameter[6];
            var oListaSolicitudes = new List<SolicitudTaxiInfo>();

            sqlParm[0] = new SqlParameter("@Id_Solicitud_Taxi", SqlDbType.VarChar);
            if (oSolicitudTaxi.IdSolicitudTaxi != null) { sqlParm[0].Value = oSolicitudTaxi.IdSolicitudTaxi; } else { sqlParm[0].Value = DBNull.Value; }

            sqlParm[1] = new SqlParameter("@Id_Empleado", SqlDbType.VarChar);
            if (oSolicitudTaxi.IdEmpleado != null) { sqlParm[1].Value = oSolicitudTaxi.IdEmpleado; } else { sqlParm[1].Value = DBNull.Value; }

            sqlParm[2] = new SqlParameter("@Fecha_Solicitud_Inicio", SqlDbType.DateTime);
            if (oSolicitudTaxi.FechaDesde.HasValue) { sqlParm[2].Value = oSolicitudTaxi.FechaDesde; } else { sqlParm[2].Value = DBNull.Value; }

            sqlParm[3] = new SqlParameter("@Fecha_Solicitud_Fin", SqlDbType.DateTime);
            if (oSolicitudTaxi.FechaHasta.HasValue) { sqlParm[3].Value = oSolicitudTaxi.FechaHasta; } else { sqlParm[3].Value = DBNull.Value; }

            sqlParm[4] = new SqlParameter("@Id_Estado_Solicitud", SqlDbType.VarChar);
            if (oSolicitudTaxi.IdEstado != null) { sqlParm[4].Value = oSolicitudTaxi.IdEstado; } else { sqlParm[4].Value = DBNull.Value; }

            sqlParm[5] = new SqlParameter("@Id_Motivo_Solicitud", SqlDbType.VarChar);
            if (oSolicitudTaxi.IdMotivoSolicitud != null) { sqlParm[5].Value = oSolicitudTaxi.IdMotivoSolicitud; } else { sqlParm[5].Value = DBNull.Value; }

            using (
                var drd = SqlHelper.ExecuteReader(SqlHelper.ConnectionStringDistributedTransaction,
                                                  CommandType.StoredProcedure, "SGA_SP_CONSULTAR_SOLICITUD_TAXI", sqlParm))
            {
                if (drd != null)
                {
                    if (drd.HasRows)
                    {
                        while (drd.Read())
                        {
                            oListaSolicitudes.Add(new SolicitudTaxiInfo(drd.GetString(0).Trim(), drd.GetString(1).Trim(),
                                new EmpleadoInfo(drd.GetString(1).Trim(), drd.GetString(2).Trim(), drd.GetString(3).Trim(),
                                    new AreaEmpleadoInfo(drd.GetString(3).Trim(), drd.GetString(4).Trim(), null), null, null),
                                drd.GetString(5).Trim(), drd.GetString(6).Trim(), drd.GetDateTime(7), drd.GetString(8).Trim(),
                                drd.GetString(9).Trim(), new EstadoSolicitudInfo(drd.GetString(9).Trim(), drd.GetString(10).Trim()),
                                drd.GetString(11).Trim(), drd.GetString(12).Trim(), drd.GetString(13).Trim(),
                                drd.GetString(14).Trim(), new MotivoViajeTaxiInfo(drd.GetString(14).Trim(), drd.GetString(15).Trim(), null, null, null),
                                null, null, drd.GetString(16).Trim(), drd.IsDBNull(17) ? (DateTime?)null : drd.GetDateTime(17), 
                                new UsuarioInfo(drd.GetString(16), null, drd.GetString(18).Trim())));
                        }

                    }
                }
            }
            return oListaSolicitudes;
        }

        public SolicitudTaxiInfo Consultar(SolicitudTaxiInfo oSolicitudTaxi)
        {
            var sqlParm = new SqlParameter[6];
            var oEntSolicitud = new SolicitudTaxiInfo();

            sqlParm[0] = new SqlParameter("@Id_Solicitud_Taxi", SqlDbType.VarChar);
            if (oSolicitudTaxi.IdSolicitudTaxi != null) { sqlParm[0].Value = oSolicitudTaxi.IdSolicitudTaxi; } else { sqlParm[0].Value = DBNull.Value; }

            sqlParm[1] = new SqlParameter("@Id_Empleado", SqlDbType.VarChar);
            if (oSolicitudTaxi.IdEmpleado != null) { sqlParm[1].Value = oSolicitudTaxi.IdEmpleado; } else { sqlParm[1].Value = DBNull.Value; }

            sqlParm[2] = new SqlParameter("@Fecha_Solicitud_Inicio", SqlDbType.DateTime);
            if (oSolicitudTaxi.FechaDesde.HasValue) { sqlParm[2].Value = oSolicitudTaxi.FechaDesde; } else { sqlParm[2].Value = DBNull.Value; }

            sqlParm[3] = new SqlParameter("@Fecha_Solicitud_Fin", SqlDbType.DateTime);
            if (oSolicitudTaxi.FechaHasta.HasValue) { sqlParm[3].Value = oSolicitudTaxi.FechaHasta; } else { sqlParm[3].Value = DBNull.Value; }

            sqlParm[4] = new SqlParameter("@Id_Estado_Solicitud", SqlDbType.VarChar);
            if (oSolicitudTaxi.IdEstado != null) { sqlParm[4].Value = oSolicitudTaxi.IdEstado; } else { sqlParm[4].Value = DBNull.Value; }

            sqlParm[5] = new SqlParameter("@Id_Motivo_Solicitud", SqlDbType.VarChar);
            if (oSolicitudTaxi.IdMotivoSolicitud != null) { sqlParm[5].Value = oSolicitudTaxi.IdMotivoSolicitud; } else { sqlParm[5].Value = DBNull.Value; }

            using (
                var drd = SqlHelper.ExecuteReader(SqlHelper.ConnectionStringDistributedTransaction,
                                                  CommandType.StoredProcedure, "SGA_SP_CONSULTAR_SOLICITUD_TAXI", sqlParm))
            {
                if (drd != null)
                {
                    if (drd.HasRows)
                    {
                        drd.Read();
                        oEntSolicitud = new SolicitudTaxiInfo(drd.GetString(0).Trim(), drd.GetString(1).Trim(),
                                new EmpleadoInfo(drd.GetString(1).Trim(), drd.GetString(2).Trim(), drd.GetString(3).Trim(),
                                    new AreaEmpleadoInfo(drd.GetString(3).Trim(), drd.GetString(4).Trim(), null), null, null),
                                drd.GetString(5).Trim(), drd.GetString(6).Trim(), drd.GetDateTime(7), drd.GetString(8).Trim(),
                                drd.GetString(9).Trim(), new EstadoSolicitudInfo(drd.GetString(9).Trim(), drd.GetString(10).Trim()),
                                drd.GetString(11).Trim(), drd.GetString(12).Trim(), drd.GetString(13).Trim(),
                                drd.GetString(14).Trim(), new MotivoViajeTaxiInfo(drd.GetString(14).Trim(), drd.GetString(15).Trim(), null, null, null),
                                null, null, drd.GetString(16).Trim(),
                                drd.IsDBNull(17) ? (DateTime?)null : drd.GetDateTime(17), 
                                new UsuarioInfo(drd.GetString(16), null, drd.GetString(18).Trim()));
                    }
                }
            }
            return oEntSolicitud;
        }

        public bool Registrar(SolicitudTaxiInfo oSolicitudTaxi, ref string sIdSolicitud)
        {
            var sqlParm = new SqlParameter[9];

            using (var con = new SqlConnection(SqlHelper.ConnectionStringDistributedTransaction))
            {
                con.Open();
                var trx = con.BeginTransaction(IsolationLevel.ReadCommitted);

                try
                {
                    sqlParm[0] = new SqlParameter("@Id_Empleado", SqlDbType.VarChar);
                    if (oSolicitudTaxi.IdEmpleado != null) { sqlParm[0].Value = oSolicitudTaxi.IdEmpleado; } else { sqlParm[0].Value = DBNull.Value; }

                    sqlParm[1] = new SqlParameter("@Origen", SqlDbType.VarChar);
                    if (oSolicitudTaxi.Origen != null) { sqlParm[1].Value = oSolicitudTaxi.Origen; } else { sqlParm[1].Value = DBNull.Value; }

                    sqlParm[2] = new SqlParameter("@Destino", SqlDbType.VarChar);
                    if (oSolicitudTaxi.Destino != null) { sqlParm[2].Value = oSolicitudTaxi.Destino; } else { sqlParm[2].Value = DBNull.Value; }

                    sqlParm[3] = new SqlParameter("@Fecha_Hora", SqlDbType.DateTime);
                    if (oSolicitudTaxi.FechaHoraSolicitud.HasValue) { sqlParm[3].Value = oSolicitudTaxi.FechaHoraSolicitud; } else { sqlParm[3].Value = DBNull.Value; }

                    sqlParm[4] = new SqlParameter("@Id_Motivo", SqlDbType.VarChar);
                    if (oSolicitudTaxi.IdMotivoSolicitud != null) { sqlParm[4].Value = oSolicitudTaxi.IdMotivoSolicitud; } else { sqlParm[4].Value = DBNull.Value; }

                    sqlParm[5] = new SqlParameter("@Observaciones", SqlDbType.VarChar);
                    if (oSolicitudTaxi.Observaciones != null) { sqlParm[5].Value = oSolicitudTaxi.Observaciones; } else { sqlParm[5].Value = DBNull.Value; }

                    sqlParm[6] = new SqlParameter("@Id_Estado_Solicitud", SqlDbType.VarChar);
                    if (oSolicitudTaxi.IdEstado != null) { sqlParm[6].Value = oSolicitudTaxi.IdEstado; } else { sqlParm[6].Value = DBNull.Value; }

                    sqlParm[7] = new SqlParameter("@Usuario_Sistema", SqlDbType.VarChar);
                    if (oSolicitudTaxi.UsuarioSistema != null) { sqlParm[7].Value = oSolicitudTaxi.UsuarioSistema; } else { sqlParm[7].Value = DBNull.Value; }

                    sqlParm[8] = new SqlParameter("@Id", SqlDbType.VarChar, 10) { Direction = ParameterDirection.Output };

                    SqlHelper.ExecuteNonQuery(trx, CommandType.StoredProcedure, "SGA_SP_REGISTRAR_SOLICITUD_TAXI", sqlParm);
                    sIdSolicitud = sqlParm[8].Value.ToString();
                    trx.Commit();
                }
                catch (Exception)
                {
                    trx.Rollback();
                    return false;
                }
                finally
                {
                    con.Close();
                }
            }
            return true;
        }

        public bool Actualizar(SolicitudTaxiInfo oSolicitudTaxi)
        {
            var sqlParm = new SqlParameter[8];

            using (var con = new SqlConnection(SqlHelper.ConnectionStringDistributedTransaction))
            {
                con.Open();
                var trx = con.BeginTransaction(IsolationLevel.ReadCommitted);

                try
                {

                    sqlParm[0] = new SqlParameter("@Id_Solicitud", SqlDbType.VarChar);
                    if (oSolicitudTaxi.IdSolicitudTaxi != null) { sqlParm[0].Value = oSolicitudTaxi.IdSolicitudTaxi; } else { sqlParm[0].Value = DBNull.Value; }

                    sqlParm[1] = new SqlParameter("@Id_Empleado", SqlDbType.VarChar);
                    if (oSolicitudTaxi.IdEmpleado != null) { sqlParm[1].Value = oSolicitudTaxi.IdEmpleado; } else { sqlParm[1].Value = DBNull.Value; }

                    sqlParm[2] = new SqlParameter("@Origen", SqlDbType.VarChar);
                    if (oSolicitudTaxi.Origen != null) { sqlParm[2].Value = oSolicitudTaxi.Origen; } else { sqlParm[2].Value = DBNull.Value; }

                    sqlParm[3] = new SqlParameter("@Destino", SqlDbType.VarChar);
                    if (oSolicitudTaxi.Destino != null) { sqlParm[3].Value = oSolicitudTaxi.Destino; } else { sqlParm[3].Value = DBNull.Value; }

                    sqlParm[4] = new SqlParameter("@Fecha_Hora", SqlDbType.DateTime);
                    if (oSolicitudTaxi.FechaHoraSolicitud.HasValue) { sqlParm[4].Value = oSolicitudTaxi.FechaHoraSolicitud; } else { sqlParm[4].Value = DBNull.Value; }

                    sqlParm[5] = new SqlParameter("@Id_Motivo", SqlDbType.VarChar);
                    if (oSolicitudTaxi.IdMotivoSolicitud != null) { sqlParm[5].Value = oSolicitudTaxi.IdMotivoSolicitud; } else { sqlParm[5].Value = DBNull.Value; }

                    sqlParm[6] = new SqlParameter("@Observaciones", SqlDbType.VarChar);
                    if (oSolicitudTaxi.Observaciones != null) { sqlParm[6].Value = oSolicitudTaxi.Observaciones; } else { sqlParm[6].Value = DBNull.Value; }

                    sqlParm[7] = new SqlParameter("@Usuario_Sistema", SqlDbType.VarChar);
                    if (oSolicitudTaxi.UsuarioSistema != null) { sqlParm[7].Value = oSolicitudTaxi.UsuarioSistema; } else { sqlParm[7].Value = DBNull.Value; }

                    SqlHelper.ExecuteNonQuery(trx, CommandType.StoredProcedure, "SGA_SP_ACTUALIZAR_SOLICITUD_TAX", sqlParm);
                    trx.Commit();
                }
                catch (Exception)
                {
                    trx.Rollback();
                    return false;
                }
                finally
                {
                    con.Close();
                }
            }
            return true;
        }

        public bool Aprobar(SolicitudTaxiInfo oSolicitudTaxi)
        {
            var sqlParm = new SqlParameter[5];

            using (var con = new SqlConnection(SqlHelper.ConnectionStringDistributedTransaction))
            {
                con.Open();
                var trx = con.BeginTransaction(IsolationLevel.ReadCommitted);

                try
                {
                    sqlParm[0] = new SqlParameter("@Id_Solicitud", SqlDbType.VarChar);
                    if (oSolicitudTaxi.IdSolicitudTaxi != null)
                        sqlParm[0].Value = oSolicitudTaxi.IdSolicitudTaxi;
                    else
                        sqlParm[0].Value = DBNull.Value;

                    sqlParm[1] = new SqlParameter("@Id_Estado_Solicitud", SqlDbType.VarChar);
                    if (oSolicitudTaxi.IdEstado != null)
                        sqlParm[1].Value = oSolicitudTaxi.IdEstado;
                    else
                        sqlParm[1].Value = DBNull.Value;

                    sqlParm[2] = new SqlParameter("@Usuario_Aprobacion", SqlDbType.VarChar);
                    if (oSolicitudTaxi.UsuarioAprobacion != null)
                        sqlParm[2].Value = oSolicitudTaxi.UsuarioAprobacion;
                    else
                        sqlParm[2].Value = DBNull.Value;

                    sqlParm[3] = new SqlParameter("@Usuario_Atencion", SqlDbType.VarChar);
                    if (oSolicitudTaxi.UsuarioAtencion != null)
                        sqlParm[3].Value = oSolicitudTaxi.UsuarioAtencion;
                    else
                        sqlParm[3].Value = DBNull.Value;

                    sqlParm[4] = new SqlParameter("@Observaciones_Aprobacion", SqlDbType.VarChar);
                    if (oSolicitudTaxi.ObservacionAprobacion != null)
                        sqlParm[4].Value = oSolicitudTaxi.ObservacionAprobacion;
                    else
                        sqlParm[4].Value = DBNull.Value;

                    SqlHelper.ExecuteNonQuery(trx, CommandType.StoredProcedure, "SGA_SP_ACTUALIZAR_ESTADO_SOLICITUD_TAXI", sqlParm);
                    trx.Commit();
                }
                catch (Exception)
                {
                    trx.Rollback();
                    return false;
                }
                finally
                {
                    con.Close();
                }
            }
            return true;
        }
    }
}
